package uva.sc.ql.patronElements;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import uva.sc.ql.ast.IQLExpressionNodeVisitor;
import uva.sc.ql.ast.IQLFormNodeVisitor;
import uva.sc.ql.ast.IQLStatementNodeVisitor;
import uva.sc.ql.atom.BooleanAtom;
import uva.sc.ql.atom.ID;
import uva.sc.ql.atom.NumberAtom;
import uva.sc.ql.atom.StringAtom;
import uva.sc.ql.expression.binaryExpressions.Addition;
import uva.sc.ql.expression.binaryExpressions.And;
import uva.sc.ql.expression.binaryExpressions.Division;
import uva.sc.ql.expression.binaryExpressions.Equals;
import uva.sc.ql.expression.binaryExpressions.GreaterThan;
import uva.sc.ql.expression.binaryExpressions.GreaterThanEquals;
import uva.sc.ql.expression.binaryExpressions.LesserThan;
import uva.sc.ql.expression.binaryExpressions.LesserThanEquals;
import uva.sc.ql.expression.binaryExpressions.Modulus;
import uva.sc.ql.expression.binaryExpressions.Multiplication;
import uva.sc.ql.expression.binaryExpressions.NotEquals;
import uva.sc.ql.expression.binaryExpressions.Or;
import uva.sc.ql.expression.binaryExpressions.Substraction;
import uva.sc.ql.expression.unaryExpressions.Minus;
import uva.sc.ql.expression.unaryExpressions.Not;
import uva.sc.ql.form.Form;
import uva.sc.ql.statements.IfStatement;
import uva.sc.ql.statements.Question;
import uva.sc.ql.statements.Statement;
/**
* Generates a map of questions (A) and their patron questions (B), that is
* questions (B) that their value will affect the first (A).
*
* @author Pantelis & Santiago
*/
@SuppressWarnings({ "unchecked" })
public class PatronQuestionsVisitor implements
IQLExpressionNodeVisitor<Object>, IQLFormNodeVisitor<Object>,
IQLStatementNodeVisitor<Object> {
private Map<ID, List<ID>> patronElements = new HashMap<ID, List<ID>>();
private ID currentElement;
public Map<ID, List<ID>> getPatronElements() {
return patronElements;
}
public Object visit(Form questionnaire) {
List<Statement> statements = questionnaire.getStatements();
for (Statement statement : statements) {
statement.accept(this);
}
return null;
}
public Object visit(Question question) {
currentElement = question.getId();
if (question.getExpr() != null) {
question.getExpr().accept(this);
}
return null;
}
public Object visit(IfStatement ifStatement) {
List<Question> questions = ifStatement.getQuestions();
for (Question question : questions) {
question.accept(this);
ifStatement.getExpr().accept(this);
}
return null;
}
public Object visit(ID id) {
List<ID> elements = patronElements.get(id);
if (elements == null) {
elements = new ArrayList<ID>();
}
elements.add(currentElement);
patronElements.put(id, elements);
return null;
}
public Object visit(Addition addition) {
addition.getFirstOperand().accept(this);
addition.getSecondOperand().accept(this);
return null;
}
public Object visit(And and) {
and.getFirstOperand().accept(this);
and.getSecondOperand().accept(this);
return null;
}
public Object visit(Division division) {
division.getFirstOperand().accept(this);
division.getSecondOperand().accept(this);
return null;
}
public Object visit(Equals equals) {
equals.getFirstOperand().accept(this);
equals.getSecondOperand().accept(this);
return null;
}
public Object visit(GreaterThan greaterThan) {
greaterThan.getFirstOperand().accept(this);
greaterThan.getSecondOperand().accept(this);
return null;
}
public Object visit(GreaterThanEquals greaterThanEquals) {
greaterThanEquals.getFirstOperand().accept(this);
greaterThanEquals.getSecondOperand().accept(this);
return null;
}
public Object visit(LesserThan lesserThan) {
lesserThan.getFirstOperand().accept(this);
lesserThan.getSecondOperand().accept(this);
return null;
}
public Object visit(LesserThanEquals lesserThanEquals) {
lesserThanEquals.getFirstOperand().accept(this);
lesserThanEquals.getSecondOperand().accept(this);
return null;
}
public Object visit(Modulus mod) {
mod.getFirstOperand().accept(this);
mod.getSecondOperand().accept(this);
return null;
}
public Object visit(Multiplication mult) {
mult.getFirstOperand().accept(this);
mult.getSecondOperand().accept(this);
return null;
}
public Object visit(NotEquals notEquals) {
notEquals.getFirstOperand().accept(this);
notEquals.getSecondOperand().accept(this);
return null;
}
public Object visit(Or or) {
or.getFirstOperand().accept(this);
or.getSecondOperand().accept(this);
return null;
}
public Object visit(Substraction sub) {
sub.getFirstOperand().accept(this);
sub.getSecondOperand().accept(this);
return null;
}
public Object visit(Minus minus) {
minus.getOperand().accept(this);
return null;
}
public Object visit(Not not) {
not.getOperand().accept(this);
return null;
}
public Object visit(BooleanAtom bool) {
return null;
}
public Object visit(NumberAtom doub) {
return null;
}
public Object visit(StringAtom str) {
return null;
}
}